<?php
/**
 * @author: liaofei<136327134@qq.com>
 * @day: 2020/7/2
 */

namespace app\dao\system;

use App\Dao\BaseDao;
use App\Models\system\SystemMenusModel;

/**
 * 菜单dao层
 * Class SystemMenusDao
 * @package app\dao\system
 */
class SystemMenusDao extends BaseDao
{

    /**
     * 设置模型
     * @return string
     */
   public function setModel(){
        return SystemMenusModel::class;
    }
    

    /**
     * 获取权限菜单列表
     * @param array $where
     * @param array $field
     * @return \think\Collection
     */
    public function getMenusRoule(array $where, array $field = [],int $type=1)
    {
        
        if (!$field) {
            $field = ['id', 'menu_name', 'icon', 'pid', 'sort', 'menu_path', 'is_show', 'header', 'is_header', 'is_show_path','unique_auth'];
        }
        if($where['route']){
           
            $data = $this->models::where(['pid'=>0])->whereIn("id", $where['route'])->select($field)->get();
           
        }else{
            $data = $this->models::where(['pid'=>0])->select($field)->get();
           
        }
        if($type==2){
           
            if($where['route']){ 
                $data= $this->models::where(['is_show'=>1])->whereIn('id',$where['route'])->select($field)->get();
            }
             else{
                $data = $this->models::where(['is_show'=>1])->select($field)->get();
             }
        }
       
        return   $res_admin = $this->formatData($data);
    }

    /**
     * 获取菜单中的唯一权限
     * @param array $where
     * @return array
     */
    public function getMenusUnique($menuAll,$rulesStr,$select='*')
    {
        foreach ($menuAll as $k=>&$v){
            $v['children'] = $this->getList(['auth_type'=> 1, 'pid'=>$v['id'], 'is_show'=>1], $select);
            foreach ($v['children'] as $kk=>&$vv){
                $vv['children'] = $this->getList(['auth_type'=> 1, 'pid'=>$vv['id'], 'is_show'=>1], $select);
            }
        }
        $unique_auth = array_column($this->getMenusRoule($rulesStr, ['unique_auth','id'],2),'unique_auth');
        
        return ['menus'=>$menuAll,'unique_auth'=>$unique_auth];
        
    }

    /**
     * 根据访问地址获得菜单名
     * @param string $rule
     * @return mixed
     */
    public function getVisitName(string $rule)
    {
        return $this->search(['url' => $rule])->value('menu_name');
    }

    /**
     * 获取后台菜单列表并分页
     * @param array $where
     * @return \think\Collection
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\DbException
     * @throws \think\db\exception\ModelNotFoundException
     */
    public function getMenusList(array $where)
    {
        $where = array_merge($where, ['is_del' => 0]);
        return $this->search($where)->order('sort DESC,id ASC')->select();
    }

    /**
     * 菜单总数
     * @param array $where
     * @return int
     */
    public function countMenus(array $where)
    {
        $where = array_merge($where, ['is_del' => 0]);
        return $this->count($where);
    }

    /**
     * 指定条件获取某些菜单的名称以数组形式返回
     * @param array $where
     * @param string $field
     * @param string $key
     * @return array
     */
    public function column(array $where, string $field, string $key)
    {
        return $this->search($where)->column($field, $key);
    }

    /**菜单列表
     * @param array $where
     * @param int $type
     * @return \think\Collection
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\DbException
     * @throws \think\db\exception\ModelNotFoundException
     */
    public function menusSelect(array $where, $type = 1)
    {
        if ($type == 1) {
            return $this->search($where)->field('id,pid,menu_name,menu_path,unique_auth,sort')->order('sort DESC')->select();
        } else {
            return $this->search($where)->group('pid')->column('pid');
        }
    }

    /**
     * 搜索列表
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\DbException
     * @throws \think\db\exception\ModelNotFoundException
     */
    public function getSearchList()
    {
        return $this->search(['is_show' => 1, 'auth_type' => 1, 'is_del' => 0, 'is_show_path' => 0])
            ->field('id,pid,menu_name,menu_path,unique_auth,sort')->order('sort DESC')->select();
    }
}
